home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Collection.h < prev    next >
C/C++ Source or Header  |  1990-11-28  |  5KB  |  164 lines

  1. #ifndef Collection_First
  2. #ifdef __GNUG__
  3. #pragma once
  4. #endif
  5. #define Collection_First
  6.  
  7. #include "Object.h"
  8. #include "Iterator.h"
  9.  
  10. extern class Collection *pCurrentCollection;
  11. extern char *cNullPointerWarning;
  12.  
  13. //---- abstract class Collection ------------------------------------------
  14.  
  15. typedef class Collection *CollPtr;
  16.  
  17. const cCollectionInitCap = 16;
  18.  
  19. class Collection: public Object {
  20. friend class CollFilterIter;
  21.     int iterCount;          // number of active iterators
  22.     int nDeleted;           // number of deleted Objects
  23.  
  24. protected:
  25.     int size;
  26.     
  27.     Collection();
  28.     virtual int GrowBy(int desiredSize);
  29.     virtual void RemoveDeleted();
  30.     void AnnounceRemove()
  31.     { nDeleted++; }
  32.     bool AnyDeleted()
  33.     { return (bool) (nDeleted > 0); }
  34.  
  35. public: 
  36.     MetaDef(Collection);
  37.     ~Collection();
  38.     bool assertclass(Class *);
  39.     void InspectorId(char *, int);
  40.     
  41.     //---- manipulation
  42.     virtual ObjPtr Add(ObjPtr);
  43.     void AddVector(ObjPtr op1, ...);
  44.     void AddVector(va_list ap); 
  45.     virtual ObjPtr Remove(ObjPtr);
  46.     virtual ObjPtr RemovePtr(ObjPtr);
  47.     virtual void AddAll (CollPtr);
  48.     virtual void RemoveAll (CollPtr);
  49.     void FreeAll ();
  50.     virtual void Empty (int);
  51.     //      empty the contents of a collection and reinitialize it with a
  52.     //      given capacity
  53.     virtual ObjPtr Clone();  
  54.  
  55.     //---- accessing
  56.     virtual Iterator *MakeIterator(); // return an iterator of a collection
  57.     // if efficency is important the follwing functions should be overridden!!   
  58.     virtual ObjPtr At (int);
  59.     virtual bool Contains (ObjPtr);   // based on IsEqual
  60.     virtual bool ContainsPtr (ObjPtr);// based on the identity of the objects
  61.     virtual int OccurrencesOf (ObjPtr); // based on IsEqual
  62.     virtual int OccurrencesOfPtr (ObjPtr); // based on the identity of the objects
  63.     int Size()
  64.     { return size-nDeleted; }
  65.     bool IsEmpty()
  66.     { return (bool) (Size() <= 0); }
  67.     virtual ObjPtr Find(ObjPtr);        // return 0 when not found, based on IsEqual
  68.     virtual ObjPtr FindPtr(ObjPtr);     // return 0 when not found, based on identity
  69.  
  70.     //---- comparing
  71.     bool IsEqual(ObjPtr);
  72.     unsigned long Hash();
  73.  
  74.     //---- enumerating
  75.     //      the calling protocol for BoolFun and ObjFun is:
  76.     //      Fun(this,CurrentOp,Arg)    
  77.     virtual CollPtr Collect(ObjPtrFun,void * Arg = 0);
  78.     // collect the elements returned by ObjPtrFun
  79.     virtual CollPtr Select(BoolFun,void * Arg = 0);
  80.     // select all elements for the new collection where BoolFun returns true
  81.     virtual ObjPtr Detect(BoolFun,void * Arg = 0);
  82.     // find first entry where BoolFun returns true
  83.  
  84.     //---- robust iterators
  85.     void EnterIter();
  86.     void ExitIter();
  87.     bool InIterator()
  88.     { return (bool) (iterCount > 0); }
  89.     void CheckActiveIter(char *where);
  90.  
  91.     //---- converting
  92.     virtual class OrdCollection *AsOrderedCollection();
  93.     virtual class ObjArray *AsObjArray();
  94.     virtual class Bag *AsBag();
  95.     virtual class Set *AsSet();
  96.     virtual class ObjList *AsObjList();
  97.     virtual class SortedObjList *AsSortedObjList(bool ascending = TRUE);
  98.  
  99.     //---- printing
  100.     virtual ostream& DisplayOn(ostream &s);
  101.     virtual ostream& PrintOn(ostream &s);
  102.     virtual istream& ReadFrom(istream &s);
  103.  
  104.     void setCurrentCollection()
  105.     { pCurrentCollection= this; }
  106.     bool NullPointerWarning(char *where);
  107.     bool CheckNotNull(char *where, Object *op) 
  108.     { return (bool) (op == 0 ? NullPointerWarning(where) : FALSE); }
  109. };
  110.  
  111. //---- class Iter ------------------------------------------------------------
  112.  
  113. class Iter {
  114.     Iterator *seq;
  115. public:
  116.     Iter(Collection *col)
  117.     { seq= col->MakeIterator(); }
  118.     Iter(Iterator *it)
  119.     { seq= it; }
  120.     ~Iter()
  121.     { if (seq) delete seq; }
  122.     class Object *operator()()
  123.     { return (*seq)(); }
  124.     void Reset(Collection *col)
  125.     { seq->Reset(col); }
  126. };
  127.  
  128. //---- class CollFilterIter --------------------------------------------------
  129. //     iterate through a collection and apply a given filter function
  130.  
  131. class CollFilterIter : public Iterator {
  132.     Iterator *next;
  133.     ObjPtr op;
  134.     ObjPtrFun filterFun;
  135.     void *filterArg;
  136. public:
  137.     CollFilterIter(Collection *s,ObjPtrFun Filter,void *Arg = 0)
  138.     { next = s->MakeIterator(); filterFun = Filter; filterArg = Arg; }
  139.  
  140.     ~CollFilterIter();
  141.     void Reset(Collection *s);
  142.     ObjPtr operator()();
  143. };
  144.  
  145. //---- class DeletedObject ---------------------------------------------------
  146. //     place holder for deleted objects in a collection
  147.  
  148. class DeletedObject: public Object {
  149. public:
  150.     MetaDef(DeletedObject);
  151.     DeletedObject();
  152. };
  153.  
  154. #define AssertClass(name) assertclass(Meta(name))
  155.  
  156. #define ForEach(type,proc)                          \
  157. setCurrentCollection();                             \
  158. Iter _NAME3_(type,proc,_next)(pCurrentCollection);  \
  159. register type *_NAME3_(type,proc,_op);              \
  160. while (_NAME3_(type,proc,_op)= (type *) _NAME3_(type,proc,_next)())    \
  161.     _NAME3_(type,proc,_op)->proc
  162.  
  163. #endif Collection_First
  164.